from bot.enterprise_wechat_gpt.agent.extract_user_question import *
from bot.enterprise_wechat_gpt.agent.extract_user_situation import *

dir_path = os.path.dirname(os.path.realpath(__file__))


class SalesSkill(LLMAgent):
    """销售技巧 Agent"""
    sales_skill_desc: str = "“沉默销售技巧“：用户交流以下事项，包括审核失败、询问信用卡申请事项、提前还款违约金、金条逾期、征信影响、闲聊与借贷无关话题等，优先为用户解决问题，销售技巧沉默。" \
                            "“信用管理销售技巧”：给用户介绍信用管理方法，提示用户借款成功后多使用一段时间、不要提前还款，有利于系统评估。" \
                            "”活动销售技巧”：引导用户从企微链接借款参加活动，让系统识别到资金需求，后续再借贷可以获得额度和利率调整的机会。" \
                            "”提额销售技巧“：引导用户去京东金融app查看是否有金条提额入口，提额操作成功，可用的金条额度会增加。" \
                            "”优惠券销售技巧“：可以尝试给用户申请优惠券促成；使用优惠券借款，可以获得金条借贷利率优惠，节省还款息费。" \
                            "“增购销售技巧”：本次借款仅使用金条 无法满足用户资金需求，引导用户增购办理信用卡。" \
                            "“意图挖掘销售技巧“：和用户沟通借款额度、借款用途、准备用多久等，询问用户借款需求。"

    sales_skill_match_condition: str = "销售技巧选择条件(重点关注'不能使用'各销售技巧的条件)：" \
                                       "1.最常用最通用的销售技巧是”活动销售技巧”。" \
                                       "2.用户已经完成借款(借款成功或借款失败)，不能使用”活动销售技巧”、”提额销售技巧“、”优惠券销售技巧“。" \
                                       "3.金条无可用额度、金条不能用了，不能使用”活动销售技巧”、”提额销售技巧“、”优惠券销售技巧“。" \
                                       "4.用户已经完成提额(提额成功或提额失败)，不能使用”提额销售技巧“。" \
                                       "5.用户已获得优惠券、用户已使用优惠券，不能使用”优惠券销售技巧“。" \
                                       "6.用户已经说了借款需求，不能使用“意图挖掘销售技巧“。" \
                                       "7.用户已经完成借款，应该选“信用管理销售技巧”。金条无可用额度，应该选“增购销售技巧”。" \
                                       "用户表示额度低，通常选”提额销售技巧“。" \
                                       "用户对额度和利率都满意，通常选“意图挖掘销售技巧“。用户询问白条分分卡等产品，通常选“意图挖掘销售技巧“。" \
                                       "用户已获得优惠券，通常选”活动销售技巧”。用户提额成功，通常选”活动销售技巧”。"

    sales_skill_baseinfo: dict = {1: "活动销售技巧", 2: "提额销售技巧", 3: "优惠券销售技巧", 4: "信用管理销售技巧",
                                  5: "增购销售技巧", 6: "意图挖掘销售技巧", 7: "沉默销售技巧"}

    sales_template_v1: str = """
    作为一个专业的信贷领域的{salesperson_role}，你需要根据{salesperson_role}和用户的对话记录判断接下来使用的销售技巧。

    销售技巧的集合如下：
    ===
    {skill_desc}
    ===
    
    注意事项：
    =====
    {skill_match_condition}
    =====
    
    答案只能是销售技巧{skill_baseinfo}里的一种，不要选择范围外的内容，返回的结果只需要包含销售技巧名，不要再包含其他内容。
    
    用户问题：
    ===
    {user_question}
    ===
    
    用户情境：
    ===
    {user_situation}
    ===
    
    对话记录：
    ===
    {conversation_history}
    ===
    
    仅选择{skill_baseinfo}里的一个销售技巧名是：
    """
    #     结合对话记录、用户问题、用户情景、背景知识、销售技巧、销售技巧匹配条件，考虑各销售技巧具体适用的场景，请一步步思考，分析原因，

    def __init__(self, conversation_history, user_question, user_situation):
        # conversation_history是整合同一角色的连续多行对话 为一行后，得到的对话历史list
        # user_question是UserQuestion-抽取用户问题Agent的 用户问题抽取结果
        self.prompt = self.sales_template_v1
        self.conversation_str = '\n###'.join([list(d.keys())[0] + ':' + list(d.values())[0] for d in conversation_history])

        self.user_question = user_question
        self.user_situation = user_situation

        self.prompt = self.prompt.format(salesperson_role=SYSTEM,
                                         conversation_history=self.conversation_str,
                                         skill_desc=self.sales_skill_desc,
                                         skill_match_condition=self.sales_skill_match_condition,
                                         skill_baseinfo=self.sales_skill_baseinfo,
                                         user_question=self.user_question, user_situation=self.user_situation)
        super().__init__(self.prompt)


###########################################################################################################################################################


def load_sales_skill_utter(path='knowledge_base/raw_data/销售技巧agent话术-1.xlsx'):
    sales_skill_utter = {}
    df = pd.read_excel(path)
    df_group = df.groupby('销售技巧类型')
    for k, v in df_group:
        trick_type, trick_utter = k, v['话术'].tolist()
        trick_utter_dict = {(i+1): trick_utter[i] for i in range(len(trick_utter))}
        sales_skill_utter[trick_type] = trick_utter_dict
    return sales_skill_utter


sales_skill_utter: dict = load_sales_skill_utter()   # 读入一次，销售技巧 话术语料库


async def get_sales_skill(deal_conversation_history, user_question, user_situation, has_coupon=False):
    user_id = local_data.user_id
    sales_skill_name = "活动销售技巧"
    if len(deal_conversation_history) <= 1:
        sales_skill_name = "默认激活语"
    else:
        skill_choose = SalesSkill(deal_conversation_history, user_question, user_situation)
        if distribute(user_id, 2):
            res_skill_choose = await skill_choose.achat_llm(agent_name='销售技巧')
        else:
            res_skill_choose = await skill_choose.achat_llm(agent_name='销售技巧', model_version='wechat_financial_7b_1218')
        logging.info(f"userId:[{user_id}] 销售技巧 原始输出结果: {res_skill_choose}")
        res_skill_choose = correct(res_skill_choose)
        logging.info(f"userId:[{user_id}] 销售技巧 修正输出结果: {res_skill_choose}")
        for idx in skill_choose.sales_skill_baseinfo:
            if skill_choose.sales_skill_baseinfo[idx] in res_skill_choose or res_skill_choose in [idx, str(idx)]:
                sales_skill_name = skill_choose.sales_skill_baseinfo[idx]
                break
    if sales_skill_name == '优惠券销售技巧' and not has_coupon:
        sales_skill_name = '活动销售技巧'
        logging.warning(f"userId:[{user_id}] 用户没有优惠券, 用活动销售技巧代替")
    return sales_skill_name


def correct(res_skill_choose):
    res_skill_choose = res_skill_choose.replace("answer:", "")
    res_skill_choose = res_skill_choose.replace("answer：", "")
    res_skill_choose = res_skill_choose.replace("Answer:", "")
    res_skill_choose = res_skill_choose.replace("Answer：", "")
    res_skill_choose = res_skill_choose.replace("选择销售技巧：", "")
    res_skill_choose = res_skill_choose.replace("response:", "")
    res_skill_choose = res_skill_choose.replace("response：", "")
    res_skill_choose = res_skill_choose.replace("回答：", "")
    res_skill_choose = res_skill_choose.replace("解决方案：", "")
    res_skill_choose = res_skill_choose.replace("1: ", "")
    res_skill_choose = res_skill_choose.replace("7: ", "")
    res_skill_choose = res_skill_choose.replace("【销售技巧】：", "")
    res_skill_choose = res_skill_choose.replace("Choose an ", "")
    res_skill_choose = res_skill_choose.replace("[答案] ", "")
    return res_skill_choose


def get_sales_skill_utter(sales_skill_name):
    res_sales_skill_utter_set = {}
    if sales_skill_name != "默认激活语":
        res_sales_skill_utter_set = sales_skill_utter.get(sales_skill_name, '')
    return res_sales_skill_utter_set




if __name__ == '__main__':
    role1, role2 = ASSISTANT, USER


    test = 1
    if test == 1:
        test_cov = {"活动销售技巧": [{role1: "可以和小鑫说说您的用款目标、要解决的问题，帮您规划一下适合您的方案哈。"}, {role2: "主要需要周转资金，想借2w。"}],
                    "提额销售技巧": [{role1: "这边给您做个简单的回访：目前对您本次的额度和利率还满意吗？可以和小鑫说说您的用款目标、要解决的问题，帮您规划一下适合您的方案哈。"}, {role2: "额度太低了"}],
                    "优惠券销售技巧": [{role1: "这边给您做个简单的回访：目前对您本次的额度和利率还满意吗？可以和小鑫说说您的用款目标、要解决的问题，帮您规划一下适合您的方案哈。"}, {role2: "利率太高了，有没有优惠券"}],
                    "信用管理销售技巧": [{role1: "您这边是通过链接借款成功了吗"}, {role2: "是的"}],
                    "增购销售技巧": [{role1: "您的金条现在可用吗？"}, {role2: "现在没有额度了，借不了了[捂脸]"}],
                    "意图挖掘销售技巧": [{role1: "目前对您本次的额度和利率还满意吗？"}, {role2: "满意"}],
                    "沉默销售技巧": [{role1: "您的金条现在可用吗？"}, {role2: "金条逾期了"}]
                    }

        for i in test_cov:
            print('Testing trick name..................> %s' % i)
            print('Testing use coversation.............> %s' % test_cov[i])
            deal_conversation_history = merge_role_conversation(test_cov[i])
            tasks_1 = [get_user_question(deal_conversation_history), get_user_situation(deal_conversation_history)]
            loops = asyncio.get_event_loop()
            user_question, user_situation = loops.run_until_complete(asyncio.gather(*tasks_1))

            #sales_skill_name = get_sales_skill(deal_conversation_history, user_question, user_situation)
            sales_skill_name = loops.run_until_complete(get_sales_skill(deal_conversation_history, user_question, user_situation))
            print('LLM Judge Result....................> \n %s \n\n' % sales_skill_name)







    elif test == 2:
        raw_conversation_history = [{role1: '有借款需要的话，可以通过企微专属链接借款，以便后期系统复审时您有机会调整额度和利率，具体显示以页面为准。请问您这次需要解决什么财务问题呢？您目前界面还有额度哈？'},
                                {role2: '还有5000额度，我要一万'}, {role2: '额度不够用，怎么办？'}, {role2: '你能给提点么'},
                                {role1: '您的额度问题我记下了哈~小鑫现在带您查看一下提额的名额哈！'}, {role1: '您打开京东金融app，点击【金条借款】-【我的】-【我的额度】，您把截图发给我一下，帮您根据您自身的情况推荐一下提额方式哈，有通道开放吗？您看到提额任务了吗？'},
                                {role2: '好的，提额专区？'}, {role2: '我这里好像有几条'}]   # 全局存储 单一用户 所有会话历史

        deal_conversation_history = merge_role_conversation(raw_conversation_history)
        tasks_1 = [get_user_question(deal_conversation_history), get_user_situation(deal_conversation_history)]
        loops = asyncio.get_event_loop()
        user_question, user_situation = loops.run_until_complete(asyncio.gather(*tasks_1))

        sales_skill_name = loops.run_until_complete(get_sales_skill(deal_conversation_history, user_question, user_situation))
        res_sales_skill_utter_set = get_sales_skill_utter(sales_skill_name)
        print(res_sales_skill_utter_set)










